package org.langqiao.io.file;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 * swing做的文件管理器
 * @author YMY
 *
 */
public class SimpleFileManagerJFrame extends JFrame implements ActionListener {
	
	private static final long serialVersionUID = -7147862988058449715L;
	private File dir;//文件对象，表示指定目录
	private File[] files;//保存指定目录中的所有文件
	private JTextField text;//地址栏，显示目录路径
	private JList jlist;//列表框，显示目录中的所有文件和子目录
	
	private SimpleFileManagerJFrame(){
		super("文件管理器");
		this.setBounds(300,200,600,480);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.dir = new File(".","");//创建表示当前目录的文件对象
		this.text = new JTextField(this.dir.getAbsolutePath());//显示目录路径
		this.getContentPane().add(this.text,"North");
		this.text.addActionListener(this);
		
		this.files = this.dir.listFiles();//返回指定目录中所有文件对象
		String[] filenames = this.dir.list();//返回指定目录中所有文件名字符窜
		this.jlist = new JList(filenames);//所有文件名字符窜显示在列表框中
		this.getContentPane().add(this.jlist);
		JMenuBar menubar = new JMenuBar();
		this.setJMenuBar(menubar);//菜单栏添加到框架窗口
		String menustr[]={"文件","编辑","查看","帮助"};//以下创建菜单，添加到菜单栏中
		JMenu menu[] = new JMenu[menustr.length];
		for(int i=0;i<menu.length;i++){
			menu[i] = new JMenu(menustr[i]);//创建菜单
			menubar.add(menu[i]);
		}
		JMenu menu_new = new JMenu("新建");
		menu[0].add(menu_new);//“文件”菜单中添加“新建”菜单子项
		String menuitemstr_new[] = {"文件夹","文本文档"};//以下创建菜单项，添加到"新建"菜单
		JMenuItem menuitem_new[] = new JMenuItem[menuitemstr_new.length];
		for(int i=0;i<menuitem_new.length;i++){
			menuitem_new[i] = new JMenuItem(menuitemstr_new[i]);
			menu_new.add(menuitem_new[i]);//菜单项加入到菜单
			menuitem_new[i].addActionListener(this);//为菜单项注册单击事件监听器
		}
		String menuitemstr_file[] = {"打开","重命名","删除"};//以下创建菜单项，添加到文件菜单
		JMenuItem menuitem_file[] = new JMenuItem[menuitemstr_file.length];
		for(int i=0;i<menuitem_file.length;i++) {
			menuitem_file[i] = new JMenuItem(menuitemstr_file[i]);
			menu[0].add(menuitem_file[i]);
			menuitem_file[i].addActionListener(this);
		}
		//以下创建菜单项，添加到编辑菜单
		String menuitemstr_edit[] = {"剪切","复制","粘贴","复制到备份文件夹中"};
		JMenuItem menuitem_edit[] = new JMenuItem[menuitemstr_edit.length];
		for(int i=0;i<menuitem_edit.length;i++) {
			menuitem_edit[i] = new JMenuItem(menuitemstr_edit[i]);
			menu[1].add(menuitem_edit[i]);
			menuitem_edit[i].addActionListener(this);
		}
		JMenuItem menuitem_up = new JMenuItem("返回上级");
		menu[2].add(menuitem_up);
		menuitem_up.addActionListener(this);
		this.setVisible(true);
	}
	
	//单击事件处理方法
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==this.text)//单击文本行
			this.dir=new File(this.text.getText());//进入指定文件夹
		if(e.getActionCommand()=="返回上一级")//单击查看返回上级菜单项时
			this.dir=this.dir.getParentFile();
		if(e.getActionCommand()=="文件夹")//单击文件新建文件夹菜单项
			new File(this.dir,"新建文件夹").mkdir();//为文件对象创建一个目录
		if(e.getActionCommand()=="文本文档")//单击文件、新建、文本文档菜单项
		try{
			new File(this.dir,"新建文本文档.txt").createNewFile();//为文件对象创建一个空的文件
		}catch(IOException ioe){
			ioe.printStackTrace();
		}
		int i=this.jlist.getSelectedIndex();
		//选中列表框中第一个选中数据项的序号，从0开始:没有选中时返回-1;
		//单击文件重命名选项
		if(e.getActionCommand()=="重命名"&&i!=-1){
			String filename=JOptionPane.showInputDialog(this,"文件名");
			if(filename!=null&&filename!=""){
				if(this.files[i].isFile()&&!(filename.endsWith(".txt")||filename.endsWith(".TXT")))
						filename+=".txt";
				this.files[i].renameTo(new File(this.dir,filename));
			}
		}
		//单击文件打开菜单项
		if(e.getActionCommand()=="打开"&&i!=-1){
			if(this.files[i].isFile()){
				String fname=(String)this.jlist.getSelectedValue();
				//返回列表框第一个选中数据项的值，没有选中时返回null
				int j=fname.lastIndexOf('.');
				if(j>0){
					String extend=fname.substring(j+1);//获得"."之后 的扩展名字符窜
					if(extend.equals("txt")||extend.equals("java"))
						new TextFileEditorJFrame(this.files[i]);//打开文本文件编辑器
					else
						JOptionPane.showMessageDialog(this,"运行错误，不能打开这种类型的错误！");
				} else {
					this.dir=this.files[i];
					this.text.setText(this.dir.getAbsolutePath());
				}
			}
		}
		if(e.getActionCommand()=="删除"&&i!=1){
			//当前是文件，不能复制目录
			if(this.files[i].isFile()) {
				if(JOptionPane.showConfirmDialog(this,"删除\""+this.files[i].getName()+"\"文件？")==0){
					this.files[i].delete();//删除文件
				}
			}else{
				if(JOptionPane.showConfirmDialog(this,"删除\""+this.files[i].getName()+"\"文件夹中所有子目录和文件？")==0){
					this.deleteDir(files[i]);//删除指定目录中所有子目录和文件
				}
			}
		}
		this.files=this.dir.listFiles();
		String[]filenames=this.dir.list();
		this.jlist.setListData(filenames);//重新设置列表框中数据项
		if(e.getActionCommand()=="复制到备份文件中"&&i!=-1)//单击编辑复制菜单项
		//尽复制文件，不复制目录
		if(this.files[i].isFile()) {
			File dir_copyto=new File(this.dir.getAbsolutePath()+"\\备份","");//创建目录
			File f2=new File(dir_copyto,this.files[i].getName());//创建复制的文件
			//目录不存在时
			if(!dir_copyto.exists()) {
				dir_copyto.mkdir();//创建目录
				this.copyFile(this.files[i],f2);//复制文件
			}else{	//目录存在时
				//文件不存在时
				if(!f2.exists()){
					this.copyFile(this.files[i],f2);
				}else {		//文件存在时
					if(this.files[i].lastModified()>f2.lastModified()){
						this.copyFile(this.files[i],f2);//待复制文件日期校新时复制
					}
				}				
			}
		}
	}
	
	//删除指定目录中所有子目录及文件，递归算法
	public void deleteDir(File d) {
		File[] fs = d.listFiles();//返回指定目录中所有文件列表
		for(int i=0;i<fs.length;i++){
			if(fs[i].isDirectory())
				deleteDir(fs[i]);	//递归调用
			fs[i].delete();	//删除文件或空目录
		}
		d.delete();
	}
	
	//复制文件，使用于任意类型文件，将file1文件内容复制到f2文件中，重写方式
	public void copyFile(File file1,File file2) {
		try {
			FileInputStream fin = new FileInputStream(file1);//创建文件输入流对象
			FileOutputStream fout = new FileOutputStream(file2);//创建文件输出流对象
			byte[] buffer = new byte[512];//字节缓冲区
			int count=0;
			do{
				count=fin.read(buffer);
				if(count!=-1)
					fout.write(buffer);//读取输入流
			}while(count!=-1);
			fin.close();//关闭输入流
			fout.close();//关闭输出流
			file2.setLastModified(file1.lastModified());//将文件最后 的修改时间设为源文件最后修改 的时间
		}catch(IOException ioex){
			JOptionPane.showMessageDialog(this,"复制"+file1.getName()+"文件，未成功");
		}
	}
	
	public static void main(String[] args){
		new SimpleFileManagerJFrame();
	}

}
